/*
 * Copyright 2002-2019 Intel Corporation.
 * 
 * This software and the related documents are Intel copyrighted materials, and your
 * use of them is governed by the express license under which they were provided to
 * you ("License"). Unless the License provides otherwise, you may not use, modify,
 * copy, publish, distribute, disclose or transmit this software or the related
 * documents without Intel's prior written permission.
 * 
 * This software and the related documents are provided as is, with no express or
 * implied warranties, other than those that are expressly stated in the License.
 * 
 * This file incorporates work covered by the following copyright and permission notice:
 */

/*-
 * Copyright (c) 1996-1997 John D. Polstra.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD$
 */

#ifndef _MACHINE_ELF_H_
#define _MACHINE_ELF_H_ 1

#ifdef TARGET_IA32
#define __ELF_WORD_SIZE 32
#else
#define __ELF_WORD_SIZE 64
#endif

/*
 * ELF definitions for the i386 architecture.
 */

#include "../../sys/elf32.h"  /* Definitions common to all 32 bit architectures. */
#if defined(__ELF_WORD_SIZE) && __ELF_WORD_SIZE == 64
#include "../../sys/elf64.h"  /* Definitions common to all 64 bit architectures. */
#endif

/*
 * Auxiliary vector entries for passing information to the interpreter.
 *
 * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
 * but POSIX lays claim to all symbols ending with "_t".
 */

typedef struct {  /* Auxiliary vector entry on initial stack */
  uint32_t /*int*/  a_type;     /* Entry type. */
  union {
    uint32_t /*long*/ a_val;    /* Integer value. */
    void  *a_ptr;   /* Address. */
    void  (*a_fcn)(void); /* Function pointer (not used). */
  } a_un;
} Elf32_Auxinfo;

/* Values for a_type. */
#define AT_NULL   0 /* Terminates the vector. */
#define AT_IGNORE 1 /* Ignored entry. */
#define AT_EXECFD 2 /* File descriptor of program to load. */
#define AT_PHDR   3 /* Program header of program already loaded. */
#define AT_PHENT  4 /* Size of each program header entry. */
#define AT_PHNUM  5 /* Number of program header entries. */
#define AT_PAGESZ 6 /* Page size in bytes. */
#define AT_BASE   7 /* Interpreter's base address. */
#define AT_FLAGS  8 /* Flags (unused for i386). */
#define AT_ENTRY  9 /* Where interpreter should transfer control. */
#define AT_NOTELF 10  /* Program is not ELF ?? */
#define AT_UID    11  /* Real uid. */
#define AT_EUID   12  /* Effective uid. */
#define AT_GID    13  /* Real gid. */
#define AT_EGID   14  /* Effective gid. */
#define AT_EXECPATH 15  /* Path to the executable. */
#define AT_CANARY 16  /* Canary for SSP. */
#define AT_CANARYLEN  17  /* Length of the canary. */
#define AT_OSRELDATE  18  /* OSRELDATE. */
#define AT_NCPUS  19  /* Number of CPUs. */
#define AT_PAGESIZES  20  /* Pagesizes. */
#define AT_PAGESIZESLEN 21  /* Number of pagesizes. */
#define AT_TIMEKEEP 22  /* Pointer to timehands. */
#define AT_STACKPROT  23  /* Initial stack protection. */
#define AT_EHDRFLAGS  24  /* e_flags field from elf hdr */
//#define AT_HWCAP  25  /* CPU feature flags. */
//#define AT_HWCAP2 26  /* CPU feature flags 2. */

#define AT_COUNT  27  /* Count of defined aux entry types. */

/*
 * Relocation types.
 */

#define R_386_COUNT 38  /* Count of defined relocation types. */

/* Define "machine" characteristics */
#define ELF_TARG_CLASS  ELFCLASS32
#define ELF_TARG_DATA ELFDATA2LSB
#define ELF_TARG_MACH EM_386
#define ELF_TARG_VER  1

#define ET_DYN_LOAD_ADDR 0x01001000

typedef struct {  /* Auxiliary vector entry on initial stack */
  uint64_t /*long*/ a_type;     /* Entry type. */
  union {
    uint64_t /*long*/ a_val;    /* Integer value. */
    void  *a_ptr;   /* Address. */
    void  (*a_fcn)(void); /* Function pointer (not used). */
  } a_un;
} Elf64_Auxinfo;

#endif /* !_MACHINE_ELF_H_ */
